import multiprocessing
import time
from multiprocessing import Pool
import asyncio
from parser import parse_video_share_url, parse_video_id, VideoSource
from data_url import src_url,dst_url
# 定义任务函数（支持任意参数）
def task(url, task_idx,idx):
    """
    任务函数示例
    :param task_id: 任务标识
    :param data: 携带的数据（可以是任意类型）
    :param delay: 模拟耗时操作（默认1秒）
    :return: (任务ID, 处理结果)
    """
    print(f"taskID : {task_idx} [{idx:03d}/{len(dst_url)}]: {url}")
    try:
        if "html" in url:
            print("not void url")
        else:
            #print(url)
            asyncio.run(parse_video_share_url(url,task_idx))
    except Exception as e:
        print("download error : "+url)
    return (url, task_idx,idx)

# 任务管理器（动态添加新任务）
class TaskManager:
    def __init__(self, max_workers):
        self.pool = Pool(processes=max_workers)
        self.task_counter = 0  # 任务计数器
        self.max_pool_cnt = max_workers

    def start(self):
        """提交初始任务"""
        for task_id in range(0,self.max_pool_cnt):
            print(f"[{task_id}] : {len(dst_url)}")
            if(task_id < len(dst_url)):
                new_task_args = (dst_url[task_id], task_id,task_id)
                self._submit_task(new_task_args)

    def _submit_task(self, task_args):
        """提交单个任务到进程池"""
        self.task_counter += 1
        # 解包参数：task_args 必须是元组，与 task 函数签名匹配
        self.pool.apply_async(
            task,
            args=task_args,
            callback=self._callback,
            error_callback=self._error_callback
        )

    def _callback(self, result):
        """任务成功回调：处理结果并添加新任务"""
        url, task_idx,idx = result
        print(f"任务 {idx} 完成，结果: [ {url} ]")
        if self.task_counter < len(dst_url):
            new_task_args = (dst_url[self.task_counter], task_idx,self.task_counter)
            # 动态生成新任务（示例逻辑：根据结果决定是否追加）
            self._submit_task(new_task_args)

    def _error_callback(self, error):
        """任务失败回调"""
        print(f"任务执行失败: {error}")

    def shutdown(self):
        """关闭进程池"""
        self.pool.close()
        self.pool.join()